package viewModel;
import java.awt.Button;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 

import modelo.entidad.Anuncio;
import modelo.entidad.Foto;
import modelo.entidad.Municipio;
import modelo.entidad.Pago;
import modelo.entidad.Zona;
import modelo.entidad.Estado;
import modelo.entidad.Sugerencia;
import modelo.entidad.Usuario;
import modelo.entidad.Inmueble;

import modelo.hibernate.dao.DaoAnuncio;
import modelo.hibernate.dao.DaoUbicacion;
import modelo.hibernate.dao.DaoUsuario;
import modelo.hibernate.dao.DaoInmueble;



import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zk.ui.event.MouseEvent;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Area;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.PieModel;
import org.zkoss.zul.SimplePieModel;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Messagebox.ClickEvent;
 
public class ComplexBorderlayoutViewModel extends SelectorComposer<Component>{
	
    private static final String searchUrl = "http://www.zkoss.org/doc/searchresult.jsp?cx=008321236477929467003%3A63kdpeqkkvw&cof=FORID%3A11&q=";
   
  //IndexUsuario
    @Wire
    private Button btnModificarD;
    @Wire
    private Textbox txtSugerencia;
    
    
    /*
    //modificarUsuario
    @Wire
    private Textbox txtLogin;
    @Wire
    private Textbox txtPassword;
    @Wire
    private Textbox txtNombre;
    @Wire
    private Textbox txtApellido;
    @Wire
    private Textbox txtCedula;
    @Wire
    private Textbox txtTelefono;
    @Wire
    private Textbox txtEmail;
    @Wire
    private Textbox txtDireccion;
    @Wire
    private Button btnModificar;
    */
      
  
    private Estado estado;
    
    private DaoUsuario daoUsuario= new DaoUsuario();
    private Usuario usuario = new Usuario();
    private DaoInmueble daoInmueble = new DaoInmueble();
    private Inmueble inmueble = new Inmueble();
    
    private DaoAnuncio daoAnuncio = new DaoAnuncio();
    private DaoUbicacion daoubic = new DaoUbicacion();
    
    private String search;
    private List<Inmueble> inmuebles;
    private List<Inmueble> inmueblesv;
    private List<Anuncio> anunciosm;
    private List<Anuncio> anunciospend;
    private PieModel pieModel;
    private int memoHeight = 2;
 
    List<Estado> todosEstados;
    List<Zona> zonas;
    List<Municipio> municipios;
    
    @Init
    public void init() {
    	//inmuebles.
    }
 
    public int getMemoHeight() {
		return memoHeight;
	}

	public void setMemoHeight(int memoHeight) {
		this.memoHeight = memoHeight;
	}

	@Command
    @NotifyChange("memoHeight")
    public void changeMemoHeight(
            @ContextParam(ContextType.TRIGGER_EVENT) InputEvent change) {
        try {
            int parsed = Integer.parseInt(change.getValue());
            if (parsed > 0) {
                this.memoHeight = parsed;
            }
        } catch (NumberFormatException nfe) {
            // nothing that we can do here, the validation should pick it up
        }
    }
    
	   private static List<String> tiposOperacion = new ArrayList<String>();
	   static{
	      tiposOperacion.add("Alquiler");
	      tiposOperacion.add("Venta");
	   }
	   
	   private static List<String> tiposInmueble = new ArrayList<String>();
	   static{
	      tiposInmueble.add("Casa");
	      tiposInmueble.add("Apartamento");
	   }
	   
	   public List<String> getTipoOp()
	   {
		   return tiposOperacion;
	   }
	   
	   public List<String> getTipoInm()
	   {
		   return tiposInmueble;
	   }
	   public List<Estado> getEstados() throws Exception{
			  return todosEstados=daoubic.obtenerTodosEstados();
		}
	   
	   public Estado getEstado() {
	       return estado;
	   }
  
 
    public String getSearch() {
        return search;
    }
 
    public void setSearch(String search) {
        this.search = search;
    }
 
    public PieModel getPieModel() {
        return pieModel;
    }
 
//    public List<Contribution> getContributions() {
//        return contributions;
//    }
// 
   
 
    @Command
    public void displayArea(@ContextParam(ContextType.TRIGGER_EVENT) MouseEvent event) {
        Component component = event.getAreaComponent();
 
        if (component instanceof Area) {
            Area area = (Area) component;
            Clients.alert(area.getAttribute("entity") + ":"
                    + area.getTooltiptext());
        }
    }
 
//    @Command
//    @NotifyChange("pieModel")
//    public void updatePieModel() {
//        createPieModel();
//    }
 
    public static class Contribution {
        private String area;
        private int value;
 
        public Contribution(String country, int value) {
            super();
            this.area = country;
            this.value = value;
        }
 
        public String getArea() {
            return area;
        }
 
        public void setArea(String area) {
            this.area = area;
        }
 
        public int getValue() {
            return value;
        }
 
        public void setValue(int value) {
            this.value = value;
        }
 
      }
    
    
    
    ///////////////////////////////////
    
    @Listen("onClick=#btnAceptar")  
  	public void GuardarSugerencia(){
       Session sess = Sessions.getCurrent();
       usuario=(Usuario)sess.getAttribute("usuario");
       
  	   System.out.println("Sugerencia");
  	   System.out.println((Usuario)sess.getAttribute("usuario"));
  	   System.out.println(usuario.getApellido());
  	   
  	   	 
   	  Sugerencia sug = new Sugerencia(txtSugerencia.getValue(),usuario);
      List<Sugerencia> sugs= usuario.getSugerencias();
      sugs.add(sug);
      usuario.setSugerencias(sugs);
  	 
      
  		try {
  			daoUsuario.modificarUsuario(usuario);
  			
  			Messagebox.show("Sugerencia Guardada Satisfactoriamente", "Informacion", Messagebox.OK, Messagebox.INFORMATION);
  			txtSugerencia.setValue("");
  		} catch (Exception e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  		
  
     } 
    
    
	@Command
	public void eliminarCuenta(){
		try {
			Session sess = Sessions.getCurrent();
		    Usuario usuario=(Usuario)sess.getAttribute ("usuario");
			daoUsuario.eliminarUsuario(usuario);
			Clients.showNotification("Usuario Elimnado del sistema Exitosamente","info",null,null,2000);			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Clients.showNotification("Usuario NO pudo ser Eliminado","error",null,null,2000);	
		}					
			
		
	}
    
	
	@Command
	public void cerrarSesion(){	
		 EventListener<ClickEvent> clickListener = new EventListener<Messagebox.ClickEvent>() {
	            public void onEvent(ClickEvent event) throws Exception {
	                if(Messagebox.Button.YES.equals(event.getButton())) {
	            			Session miSession = Sessions.getCurrent();
	            			miSession.invalidate();
	            			Executions.sendRedirect("index.zul");
	                }
	            }
	        };
	        Messagebox.show("Realmente desea cerrar sesion", "Mensaje de confirmacion", new Messagebox.Button[]{
	                Messagebox.Button.YES, Messagebox.Button.NO },Messagebox.QUESTION,clickListener);        
	} 
	/*
	@Listen("onClick=#btnModificarD")  
	public void GuardarPublicacion(){
		System.out.println("Fuckkk");
		Session sess = Sessions.getCurrent();
	    usuario=(Usuario)sess.getAttribute("usuario");
		System.out.println(usuario.getLogin());
		
		txtLogin.setValue(usuario.getLogin());
		txtPassword.setValue(usuario.getPassword());
		txtNombre.setValue(usuario.getNombre());
		txtApellido.setValue(usuario.getApellido());
		txtCedula.setValue(usuario.getCedula());
		txtTelefono.setValue(usuario.getTelefono());
		txtEmail.setValue(usuario.getEmail());
		txtDireccion.setValue(usuario.getDireccion());	
	}
	*/
	
/*
	@Command
	public void modificar() {
		Session sess=Sessions.getCurrent();

		usuario.setCedula(usuario.getCedula());
		usuario.setNombre(usuario.getNombre());
		usuario.setApellido(usuario.getApellido());
		usuario.setDireccion(usuario.getDireccion());
		usuario.setTelefono(usuario.getTelefono());
		usuario.setEmail(usuario.getEmail());
		usuario.setLogin(usuario.getLogin());
		usuario.setPassword(usuario.getPassword());
		usuario.setTipoUsuario(2);
		usuario.setEstatus("A");
		
			try {
				daoUsuario.modificarUsuario(usuario);
				Clients.showNotification("Informacion Modificada Exitosamente","info",null,null,2000);	
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				Clients.showNotification("Informacion NO pudo ser modificada","error",null,null,2000);
			}		
		
			
		
		
	}
    */
	
	// metodo que crea la lista de Viejas Publicaciones
    public List<Inmueble> getModeloInmuebleV() throws Exception{ 
        inmueblesv= InmueblesInactivos();
        return new ListModelList<Inmueble>(inmueblesv);
    }
    
 // metodo que crea la lista de  Publicaciones Activas
    public List<Inmueble> getModeloInmueble() throws Exception 
    {
    	 inmuebles = InmueblesActivos();
    	 return new ListModelList<Inmueble>(inmuebles);
    }
	// metodo que crea la lista de anuncios activos del portal
    public List<Anuncio> getModeloAnuncio() throws Exception{ 
        anunciosm = AnunciosActivos();
        return new ListModelList<Anuncio>(anunciosm);
    	}
 // metodo que crea la lista de anuncios pendientes por aceptar
    public List<Anuncio> getModeloAnuncioPendiente() throws Exception{ 
        anunciospend = AnunciosPendientes();
        return new ListModelList<Anuncio>(anunciospend);
    	}
    
    @Command
    @NotifyChange({"modeloInmueble", "footer"})
    public void removerProd(@BindingParam("producto") Inmueble myProd) throws Exception 
    {
    	int id=myProd.getId();
	    Anuncio anuncio = daoAnuncio.obtenerAnuncio(id);
 	    Anuncio a = new Anuncio(anuncio.getId(), anuncio.getPrecio(), anuncio.getFechapublicacion(), anuncio.getNrodias(), "I");
 	    
 	    List<Anuncio> pubs= usuario.getPublicaciones();
	    pubs.set(usuario.Buscar(pubs, id), a);
	    
	    usuario.setPublicaciones(pubs);
	    daoUsuario.modificarUsuario(usuario);
 	    //daoAnuncio.actualizarAnuncio(a);
		inmuebles = InmueblesActivos();
		
    }   
    
    @Command
    @NotifyChange({"modeloAnuncioPendiente"})
    public void rechazarPub(@BindingParam("anuncio") Anuncio myAnuncio) throws Exception 
    {
    	int id=myAnuncio.getId();
	    Anuncio anuncio = daoAnuncio.obtenerAnuncio(id);
 	    Anuncio a = new Anuncio(anuncio.getId(), anuncio.getPrecio(), anuncio.getFechapublicacion(), anuncio.getNrodias(), "I");
 	  
 	    daoAnuncio.actualizarAnuncio(a);
		anunciosm = AnunciosActivos();
		
    }   

    @Command
    @NotifyChange({"modeloAnuncioPendiente"})
    public void aceptarPub(@BindingParam("anuncio") Anuncio myAnuncio) throws Exception 
    {
   
        
    	int id=myAnuncio.getId();
	    Anuncio anuncio = daoAnuncio.obtenerAnuncio(id);
 	    Anuncio a = new Anuncio(anuncio.getId(), anuncio.getPrecio(), anuncio.getFechapublicacion(), anuncio.getNrodias(), "P");
 	    
 	  
 	    daoAnuncio.actualizarAnuncio(a);
		anunciosm = AnunciosActivos();
		
    }   
    ///METODO QUE RETORNA LOS INMUEBLES ACTIVOS
    
    public List<Inmueble> InmueblesActivos() throws Exception 
      {
    	Session sess = Sessions.getCurrent();
        usuario=(Usuario)sess.getAttribute("usuario");
        List<Inmueble> inmuebles= new ArrayList<Inmueble>();
    	List<Anuncio> anuncios = daoAnuncio.obtenerAnunciosbyUsuario(usuario);
    	List<Anuncio> anunciosaux = new ArrayList<Anuncio>();
    	
    	System.out.println("todos");
    	System.out.println(anuncios.size());
    	
    	for(int i=0; i<anuncios.size(); i++)
    	{
    		System.out.println(anuncios.get(i).getEstatus());
    		if(anuncios.get(i).getEstatus().equalsIgnoreCase("P"))
    		{
    		System.out.println("Hello");
    		Anuncio anuncio= new Anuncio(anuncios.get(i).getId(), anuncios.get(i).getPrecio(), anuncios.get(i).getFechapublicacion(), anuncios.get(i).getNrodias(), anuncios.get(i).getEstatus());
    		anunciosaux.add(anuncio);
    		}
    	}
    	System.out.println("activos");
    	System.out.println(anunciosaux.size());
    	
    	for(int i=0; i<anunciosaux.size(); i++)
    	{
              inmuebles.add(daoInmueble.obtenerInmueble(anunciosaux.get(i).getId()));
    	}
    	return inmuebles;
    }
    
     
    ///METODO QUE RETORNA LOS INMUEBLES INACTIVOS
    
    public List<Inmueble> InmueblesInactivos() throws Exception 
      {
    	Session sess = Sessions.getCurrent();
        usuario=(Usuario)sess.getAttribute("usuario");
        List<Inmueble> inmueblesv= new ArrayList<Inmueble>();
    	List<Anuncio> anuncios = daoAnuncio.obtenerAnunciosbyUsuario(usuario);
    	List<Anuncio> anunciosaux = new ArrayList<Anuncio>();
    	
    	System.out.println("todos");
    	System.out.println(anuncios.size());
    	
    	for(int i=0; i<anuncios.size(); i++)
    	{
    		System.out.println(anuncios.get(i).getEstatus());
    		if(anuncios.get(i).getEstatus().equalsIgnoreCase("I"))
    		{
    		System.out.println("Hello");
    		Anuncio anuncio= new Anuncio(anuncios.get(i).getId(), anuncios.get(i).getPrecio(), anuncios.get(i).getFechapublicacion(), anuncios.get(i).getNrodias(), anuncios.get(i).getEstatus());
    		anunciosaux.add(anuncio);
    		}
    	}
    	//System.out.println("activos");
    	//System.out.println(anunciosaux.size());
    	
    	for(int i=0; i<anunciosaux.size(); i++)
    	{
              inmueblesv.add(daoInmueble.obtenerInmueble(anunciosaux.get(i).getId()));
    	}
    	return inmueblesv;
    }
    
   ///METODO QUE RETORNA TODOS LOS ANUNCIOS SIN CONSIDERACION DE USUARIO
    
    public List<Anuncio> AnunciosActivos() throws Exception 
      {
    	Session sess = Sessions.getCurrent();
        usuario=(Usuario)sess.getAttribute("usuario");
       
        List<Anuncio> anunciosm = new ArrayList<Anuncio>();
    	List<Anuncio> anunciosAntes = daoAnuncio.obtenerTodos();
    //	List<Anuncio> anunciosaux = new ArrayList<Anuncio>();
    	
    	System.out.println("todos");
    	System.out.println(anunciosAntes.size());
    	
    	for(int i=0; i<anunciosAntes.size(); i++)
    	{
    		System.out.println(anunciosAntes.get(i).getEstatus());
    		if(anunciosAntes.get(i).getEstatus().equalsIgnoreCase("P"))
    		{
    		
    		Anuncio anuncio= new Anuncio(anunciosAntes.get(i).getId(), anunciosAntes.get(i).getPrecio(), anunciosAntes.get(i).getFechapublicacion(), anunciosAntes.get(i).getNrodias(), anunciosAntes.get(i).getEstatus());
    		anunciosm.add(anuncio);
    		}
    	}
    	System.out.println("activos");
    	System.out.println(anunciosm.size());
    	
    	
    	return anunciosm;
    }
    
 ///METODO QUE RETORNA TODOS LOS ANUNCIOS PENDIENTES POR APROB.
    
    public List<Anuncio> AnunciosPendientes() throws Exception 
      {
    	Session sess = Sessions.getCurrent();
        usuario=(Usuario)sess.getAttribute("usuario");
       
        List<Anuncio> anunciospend = new ArrayList<Anuncio>();
    	List<Anuncio> anunciosGuardados = daoAnuncio.obtenerTodos();
   
    	
    	System.out.println("todos");
    	System.out.println(anunciosGuardados.size());
    	
    	for(int i=0; i<anunciosGuardados.size(); i++)
    	{
    		System.out.println(anunciosGuardados.get(i).getEstatus());
    		if(anunciosGuardados.get(i).getEstatus().equalsIgnoreCase("R"))
    		{
    		
    		Anuncio anuncio= new Anuncio(anunciosGuardados.get(i).getId(), anunciosGuardados.get(i).getPrecio(), anunciosGuardados.get(i).getFechapublicacion(), anunciosGuardados.get(i).getNrodias(), anunciosGuardados.get(i).getEstatus());
    		anunciospend.add(anuncio);
    		}
    	}
    	System.out.println("activos");
    	System.out.println(anunciosm.size());
    	
    
    	return anunciospend;
    }

}